home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: Alpha
/
Whiteline Alpha.iso
/
progtool
/
modula2
/
hk_lib
/
def_mod
/
chars.mod
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
MacRoman (detected)
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
Modula Implementation
|
1994-09-22
|
38.9 KB
|
1,190 lines
IMPLEMENTATION MODULE Chars;
(*****************************************************************************)
(* Kommentar siehe Definitionsmodul, die Prozeduren erklaeren sich wohl von *)
(* selbst. Geplant ist eine Optimierung in Assembler, deshalb bauen die Pro- *)
(* zeduren nicht aufeinander auf, ausserdem wirds so schneller... *)
(* *)
(* Ich gestehs: Die Geschwindigkeitssteigerung durch Assemblercodierung haelt*)
(* sich, da hier keine Schleifen mit zeitaufwendigen Indexoperationen verwen-*)
(* det werden, in engen Grenzen ( 10 - 30% ); wer also die saubere Modula- *)
(* Variante vorzieht: bitte! Es muessen nur die Assemblerteile aus- und die *)
(* Modula-Teile entkommentiert werden. *)
(* *)
(* Bei der Uebersetzung ist zu beachten, dass der Testmodus ausgeschaltet *)
(* bleibt, wenn die Assemblerversionen benutzt werden sollen, da sonst Lauf- *)
(* zeitfehler auftreten ( 'Funktionsprozedur ohne RETURN' ). *)
(* Falls das griech. Beta anstatt des Sz verwendet werden soll, so muss die *)
(* entsprechende Konstante auch in den Assemblerteilen geaendert werden *)
(* ( siehe entsprechende Hinweise, einfach die INLINE's austauschen ) ! *)
(*___________________________________________________________________________*)
(* *)
(* 08-Sep-89 , hk *)
(* Begonnen *)
(* 17-Sep-89 , hk *)
(* Erste Version *)
(* 23-Sep-89 , hk *)
(* Prozeduren: IsPrintable, IsWhitespace, IsControl, *)
(* SZ nur kleiner Umlaut *)
(* 14-Okt-89 , hk *)
(* Konstanten EOL und EOS nicht mehr definiert, *)
(* IsWhitespace -> IsSpace, VTab zaehlt dazu *)
(* Konstanten: VTab, ASCII-Umlaute, Paragraph; *)
(* Typen: CharClassTest, CharConvert *)
(* Prozeduren: Tests auf ASCII-Umlaute und ASCII-Deutsch, *)
(* IsHexDigit, IsPunctuation, IsGraphic, IsASCII *)
(* Konvertieren ASCII <-> Atari, Klein <-> Gross. *)
(* 18-Okt-89 , hk *)
(* Die meisten Prozeduren in Assembler *)
(* 07-Dez-89 , hk *)
(* Assemblerteile bei "IsUmlaut","IsGerman" so geaendert, dass die *)
(* INLINE-Befehle fuer SZ nur ausgetauscht zu werden brauchen *)
(* 05-Jan-90 , hk *)
(* "IsBinDigit", "IsOctDigit" neu *)
(* 23-Jan-90 , hk *)
(* "HexDigitToCard", "CardToHexDigit" neu *)
(* 05-Feb-90 , hk *)
(* saemtliche CHAR-Konstanten aus "ASCII" importieren *)
(* 12-Feb-90 , hk *)
(* "IsPrintable", "IsGraphic" auch fuer Zeichen > 7FH, *)
(* "IsDelimiter" neu *)
(*****************************************************************************)
FROM SYSTEM IMPORT (* PROC *) VAL, INLINE;
FROM ASCII IMPORT (* CONST*) NUL, DEL, HT, CR,
kleinesAE, kleinesOE, kleinesUE, SZ, Beta,
grossesAE, grossesOE, grossesUE, Paragraph,
kleinesASCIIae, kleinesASCIIoe,
kleinesASCIIue, ASCIIsz, ASCIIParagraph,
grossesASCIIae, grossesASCIIoe,
grossesASCIIue;
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
VAR LcAtari, (* siehe Modulinitialisierung *)
UcAtari : ARRAY [0..3] OF CHAR;
hexdigits : ARRAY [0..15] OF CHAR;
(*===========================================================================*)
PROCEDURE IsASCII ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN( zeichen <= DEL);
END IsASCII;
(* --------------------------------------------------------------------------*)
PROCEDURE IsControl ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( zeichen < ' ' ) OR ( zeichen = DEL ));
END IsControl;
(* --------------------------------------------------------------------------*)
PROCEDURE IsPrintable ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( ' ' <= zeichen ) & ( zeichen # DEL ));
END IsPrintable;
(* --------------------------------------------------------------------------*)
PROCEDURE IsGraphic ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( ' ' < zeichen ) & ( zeichen # DEL ));
END IsGraphic;
(* --------------------------------------------------------------------------*)
PROCEDURE IsSpace ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN(( zeichen = ' ' ) OR
(( HT <= zeichen ) & ( zeichen <= CR ) ) );
zeichen EQU 12
RETURN EQU zeichen + 2
IsSpace:
moveq #0, d1 ; Default = FALSE
move.b zeichen(a6), d0
cmpi.b #' ', d0 ; zeichen = ' ' ?
beq.s true ; B: ja, Space
subi.b #$09, d0 ; zeichen >= HT ?
blo.s ende ; B: nein, kein Space
subq.b #$0D-$09, d0 ; zeichen <= CR ?
bhi.s ende ; B: nein, kein Space
true:
moveq #1, d1
ende:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH,000CH );
INLINE( 0C00H,0020H );
INLINE( 670AH );
INLINE( 0400H,0009H );
INLINE( 6506H );
INLINE( 5900H );
INLINE( 6202H );
INLINE( 7201H );
INLINE( 1D41H,000EH );
END IsSpace;
(* --------------------------------------------------------------------------*)
PROCEDURE IsBinDigit ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( '0' = zeichen ) OR ( zeichen = '1' ));
END IsBinDigit;
(* --------------------------------------------------------------------------*)
PROCEDURE IsOctDigit ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( '0' <= zeichen ) & ( zeichen <= '7' ));
END IsOctDigit;
(* --------------------------------------------------------------------------*)
PROCEDURE IsDigit ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( '0' <= zeichen ) & ( zeichen <= '9' ));
END IsDigit;
(* --------------------------------------------------------------------------*)
PROCEDURE IsHexDigit ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN((( '0' <= zeichen ) & ( zeichen <= '9' )) OR
(( 'A' <= zeichen ) & ( zeichen <= 'F' )) OR
(( 'a' <= zeichen ) & ( zeichen <= 'f' )));
zeichen EQU 12
RETURN EQU zeichen + 2
IsHexDigit:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer schnellen Zugriff
cmpi.b #'0', d0 ; zeichen >= '0' ?
blo.s ende ; B: nein, kein Digit
cmpi.b #'9', d0 ; zeichen <= '9' ?
bls.s true ; B: ja, Ziffer
andi.b #%11011111, d0 ; A = a
subi.b #'A', d0 ; zeichen >= 'A' ?
blo.s return ; B: nein, kein Digit
subq.b #'F'-'A', d0 ; zeichen <= 'F' ?
bhi.s ende ; B: nein, kein Digit
true:
moveq #1, d1 ; sonst TRUE
ende:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH,000CH );
INLINE( 0C00H,0030H );
INLINE( 6516H );
INLINE( 0C00H,0039H );
INLINE( 630EH );
INLINE( 0200H,00DFH );
INLINE( 0400H,0041H );
INLINE( 6506H );
INLINE( 5B00H );
INLINE( 6202H );
INLINE( 7201H );
INLINE( 1D41H,000EH );
END IsHexDigit;
(* --------------------------------------------------------------------------*)
PROCEDURE IsPunctuation ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN((( ' ' < zeichen ) & ( zeichen < '0' )) OR
(( '9' < zeichen ) & ( zeichen < 'A' )) OR
(( 'Z' < zeichen ) & ( zeichen < 'a' )) OR
(( 'z' < zeichen ) & ( zeichen < DEL )));
zeichen EQU 12
RETURN EQU zeichen + 2
IsPunctuation:
moveq #0, d1
move.b zeichen(a6), d0
cmpi.b #$7F, d0 ; zeichen < DEL ?
bhs.s ende ; B: nein, nicht Special
cmpi.b #' ', d0 ; zeichen >= ' ' ?
bls.s ende ; B: nein
cmpi.b #'0', d0 ; zeichen < '0' ?
blo.s true ; B: ja, ...
cmpi.b #'9', d0 ; '0' <= zeichen <= '9' ?
bls.s ende ; B: ja, Digit nicht special
andi.b #%11011111, d0 ; A = a
cmpi.b #'A', d0 ; zeichen = Buchstabe ?
blo.s true ; B: nein, special
cmpi.b #'Z', d0 ; zeichen = Buchstabe ?
bls.s ende ; B: ja, kein special
true:
moveq #1, d1
ende:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH,000CH );
INLINE( 0C00H,007FH );
INLINE( 6424H );
INLINE( 0C00H,0020H );
INLINE( 631EH );
INLINE( 0C00H,0030H );
INLINE( 6516H );
INLINE( 0C00H,0039H );
INLINE( 6312H );
INLINE( 0200H,00DFH );
INLINE( 0C00H,0041H );
INLINE( 6506H );
INLINE( 0C00H,005AH );
INLINE( 6302H );
INLINE( 7201H );
INLINE( 1D41H,000EH );
END IsPunctuation;
(* --------------------------------------------------------------------------*)
PROCEDURE IsDelimiter ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN(( zeichen < '0' ) OR
(( '9' < zeichen ) & ( zeichen < 'A' )) OR
(( 'Z' < zeichen ) & ( zeichen < 'a' )) OR
(( 'z' < zeichen ) & ( zeichen <=DEL )));
zeichen EQU 12
RETURN EQU zeichen + 2
IsDelimiter:
moveq #0, d1
move.b zeichen(a6), d0
cmpi.b #$7F, d0 ; zeichen < DEL ?
bhi.s ende ; B: nein, nicht Special
cmpi.b #'0', d0 ; zeichen < '0' ?
blo.s true ; B: ja, ...
cmpi.b #'9', d0 ; '0' <= zeichen <= '9' ?
bls.s ende ; B: ja, Digit nicht special
andi.b #%11011111, d0 ; A = a
cmpi.b #'A', d0 ; zeichen = Buchstabe ?
blo.s true ; B: nein, special
cmpi.b #'Z', d0 ; zeichen = Buchstabe ?
bls.s ende ; B: ja, kein special
true:
moveq #1, d1
ende:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH,000CH );
INLINE( 0C00H,007FH );
INLINE( 621EH );
INLINE( 0C00H,0030H );
INLINE( 6516H );
INLINE( 0C00H,0039H );
INLINE( 6312H );
INLINE( 0200H,00DFH );
INLINE( 0C00H,0041H );
INLINE( 6506H );
INLINE( 0C00H,005AH );
INLINE( 6302H );
INLINE( 7201H );
INLINE( 1D41H,000EH );
END IsDelimiter;
(* --------------------------------------------------------------------------*)
PROCEDURE IsSmallLetter ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( 'a' <= zeichen ) & ( zeichen <= 'z' ));
END IsSmallLetter;
(* --------------------------------------------------------------------------*)
PROCEDURE IsBigLetter ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( 'A' <= zeichen ) & ( zeichen <= 'Z' ));
END IsBigLetter;
(* --------------------------------------------------------------------------*)
PROCEDURE IsLetter ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(*
RETURN(( 'A' <= zeichen ) & ( zeichen <= 'Z' ) OR
( 'a' <= zeichen ) & ( zeichen <= 'z' ));
zeichen EQU 12
RETURN EQU zeichen + 2
IsLetter:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer schnellen Zugriff
andi.b #%11011111, d0 ; A = a
cmpi.b #'A', d0 ; zeichen < 'A' ?
blo.s return ; B: ja, kein Buchstabe
cmpi.b #'Z', d0 ; zeichen > 'Z' ?
bhi.s return ; B: ja, kein Buchstabe
moveq #1, d1 ; sonst TRUE
return:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH, 000CH );
INLINE( 0200H, 00DFH );
INLINE( 0C00H, 0041H );
INLINE( 6508H );
INLINE( 0C00H, 005AH );
INLINE( 6202H );
INLINE( 7201H );
INLINE( 1D41H, 000EH );
END IsLetter;
(* --------------------------------------------------------------------------*)
PROCEDURE IsAlphanumeric ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(*
RETURN(( 'A' <= zeichen ) & ( zeichen <= 'Z' ) OR
( 'a' <= zeichen ) & ( zeichen <= 'z' ) OR
( '0' <= zeichen ) & ( zeichen <= '9' ));
zeichen EQU 12
RETURN EQU zeichen + 2
IsAlphanumeric:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer scnellen Zugriff
cmpi.b #'0', d0 ; zeichen < '0' ?
blo.s return ; B: ja, weder Zahl noch Buchstabe
cmpi.b #'9', d0 ; zeichen <= '9' ?
bls.s true ; B: ja, Zahl, also alphanumerisch
andi.b #%11011111, d0 ; A = a
cmpi.b #'A', d0 ; zeichen < 'A' ?
blo.s return ; B: ja, weder Buchstabe noch Zahl
cmpi.b #'Z', d0 ; zeichen > 'Z' ?
bhi.s return ; B: ja, weder Buchstabe noch Zahl
true:
moveq #1, d1 ; sonst alphanumerisch
return:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH, 000CH );
INLINE( 0C00H, 0030H );
INLINE( 6518H );
INLINE( 0C00H, 0039H );
INLINE( 6310H );
INLINE( 0200H, 00DFH );
INLINE( 0C00H, 0041H );
INLINE( 6508H );
INLINE( 0C00H, 005AH );
INLINE( 6202H );
INLINE( 7201H );
INLINE( 1D41H, 000EH );
END IsAlphanumeric;
(* --------------------------------------------------------------------------*)
PROCEDURE IsSmallUmlaut ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN(( zeichen = kleinesAE ) OR
( zeichen = kleinesOE ) OR
( zeichen = kleinesUE ) OR
( zeichen = SZ ));
zeichen EQU 12
RETURN EQU zeichen + 2
IsSmallUmlaut:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer schnellen Zugriff
subi.b #'ü', d0 ; zeichen = ü ?
blo.s return ; B: ueberhaupt kein Umlaut
beq.s true ; B: ist ü
subq.b #'ä'-'ü', d0 ; zeichen = ä ?
beq.s true ; B: jo
subi.b #'ö'-'ä', d0 ; zeichen = ö ?
beq.s true ; B: ja
subi.b #'ß'-'ö', d0 ; zeichen = ß ? *** subi.b #$E1-'ö', d0 *
bne.s return ; kein Umlaut
true:
moveq #1, d1 ; ist kleiner Umlaut
return:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH, 000CH );
INLINE( 0400H, 0081H );
INLINE( 6514H );
INLINE( 6710H );
INLINE( 5700H );
INLINE( 670CH );
INLINE( 0400H, 0010H );
INLINE( 6706H );
INLINE( 0400H, 000AH ); (*** INLINE( 0400H, 004DH ); *)
INLINE( 6602H );
INLINE( 7201H );
INLINE( 1D41H, 000EH );
END IsSmallUmlaut;
(* --------------------------------------------------------------------------*)
PROCEDURE IsBigUmlaut ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( zeichen = grossesAE ) OR
( zeichen = grossesOE ) OR
( zeichen = grossesUE ));
END IsBigUmlaut;
(* --------------------------------------------------------------------------*)
PROCEDURE IsUmlaut ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN(( zeichen = kleinesAE ) OR
( zeichen = kleinesOE ) OR
( zeichen = kleinesUE ) OR
( zeichen = grossesAE ) OR
( zeichen = grossesOE ) OR
( zeichen = grossesUE ) OR
( zeichen = SZ ));
zeichen EQU 12
RETURN EQU zeichen + 2
IsUmlaut:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer schnellen Zugriff
subi.b #'ü', d0 ; zeichen = ü ?
blo.s return ; B: ueberhaupt kein Sonderzeichen
beq.s true ; B: ist ü
subq.b #'ä'-'ü', d0 ; zeichen = ä ?
beq.s true ; B: ja
subi.b #'Ä'-'ä', d0 ; zeichen = Ä ?
beq.s true ; B: ja
subq.b #'ö'-'Ä', d0 ; zeichen = ö ?
beq.s true ; B: ja
subq.b #'Ö'-'ö', d0 ; zeichen = Ö ?
beq.s true ; B: ja
subq.b #'Ü'-'Ö', d0 ; zeichen = Ü ?
beq.s true ; B: ja
subi.b #'ß'-'Ü', d0 ; zeichen = ß ? *** subi.b #$E1-'Ü', d0
bne.s return ; B: kein Umlaut
true:
moveq #1, d1
return:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH, 000CH );
INLINE( 0400H, 0081H );
INLINE( 6520H );
INLINE( 671CH );
INLINE( 5700H );
INLINE( 6718H );
INLINE( 0400H, 000AH );
INLINE( 6712H );
INLINE( 5D00H );
INLINE( 670EH );
INLINE( 5B00H );
INLINE( 670AH );
INLINE( 5300H );
INLINE( 6706H );
INLINE( 0400H,0004H ); (*** INLINE( 0400H,0047H *)
INLINE( 6602H );
INLINE( 7201H );
INLINE( 1D41H, 000EH );
END IsUmlaut;
(* --------------------------------------------------------------------------*)
PROCEDURE IsSmallGerman ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN(( 'a' <= zeichen ) & ( zeichen <= 'z' ) OR
( zeichen = kleinesAE ) OR
( zeichen = kleinesOE ) OR
( zeichen = kleinesUE ) OR
( zeichen = SZ ));
zeichen EQU 12
RETURN EQU zeichen + 2
IsSmallGerman:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer schnellen Zugriff
cmpi.b #'a', d0 ; zeichen >= 'a' ?
blo.s return ; B: nein, weder Buchstabe noch Umlaut
cmpi.b #'z', d0 ; Kleinbuchstabe ?
bls.s true ; B: ja, geritzt
subi.b #'ü', d0 ; zeichen = ü ?
blo.s return ; B: ueberhaupt kein Umlaut
beq.s true ; B: ist ü
subq.b #'ä'-'ü', d0 ; zeichen = ä ?
beq.s true ; B: jo
subi.b #'ö'-'ä', d0 ; zeichen = ö ?
beq.s true ; B: ja
subi.b #'ß'-'ö', d0 ; zeichen = ß ? *** subi.b #$E1-'ö', d0 *
bne.s return ; kein Umlaut
true:
moveq #1, d1 ; ist kleiner Umlaut oder Buchstabe
return:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH, 000CH );
INLINE( 0C00H, 0061H );
INLINE( 6520H );
INLINE( 0C00H, 007AH );
INLINE( 6318H );
INLINE( 0400H, 0081H );
INLINE( 6514H );
INLINE( 6710H );
INLINE( 5700H );
INLINE( 670CH );
INLINE( 0400H, 0010H );
INLINE( 6706H );
INLINE( 0400H, 000AH ); (*** INLINE( 0400H, 004DH ); *)
INLINE( 6602H );
INLINE( 7201H );
INLINE( 1D41H, 000EH );
END IsSmallGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE IsBigGerman ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN(( 'A' <= zeichen ) & ( zeichen <= 'Z' ) OR
( zeichen = grossesAE ) OR
( zeichen = grossesOE ) OR
( zeichen = grossesUE ));
zeichen EQU 12
RETURN EQU zeichen + 2
IsBigGerman:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer schnellen Zugriff
cmpi.b #'A', d0 ; zeichen >= 'A' ?
blo.s ende ; B: nein, weder Buchstabe noch Umlaut
cmpi.b #'Z', d0 ; Grossbuchstabe ?
bls.s true ; B: ja, geritzt
subi.b #'Ä', d0 ; zeichen = Ä ?
blo.s ende ; B: ueberhaupt kein Umlaut
beq.s true ; B: ist ü
subi.b #'Ö'-'Ä', d0 ; zeichen = Ö ?
beq.s true ; B: jo
subq.b #'Ü'-'Ö', d0 ; zeichen = Ü ?
bne.s ende ; kein Umlaut
true:
moveq #1, d1 ; ist grosser Umlaut oder Buchstabe
ende:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH, 000CH );
INLINE( 0C00H, 0041H );
INLINE( 651AH );
INLINE( 0C00H, 005AH );
INLINE( 6312H );
INLINE( 0400H, 008EH );
INLINE( 650EH );
INLINE( 670AH );
INLINE( 0400H, 000BH );
INLINE( 6704H );
INLINE( 5300H );
INLINE( 6602H );
INLINE( 7201H );
INLINE( 1D41H, 000EH );
END IsBigGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE IsGerman ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN(( 'A' <= zeichen ) & ( zeichen <= 'Z' ) OR
( 'a' <= zeichen ) & ( zeichen <= 'z' ) OR
( zeichen = kleinesAE ) OR
( zeichen = kleinesOE ) OR
( zeichen = kleinesUE ) OR
( zeichen = grossesAE ) OR
( zeichen = grossesOE ) OR
( zeichen = grossesUE ) OR
( zeichen = SZ ));
zeichen EQU 12
RETURN EQU zeichen + 2
IsGerman:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d2 ; fuer schnellen Zugriff
move.b d2, d0
andi.b #%11011111, d2 ; A = a
cmpi.b #'A', d2 ; zeichen < 'A' ?
blo.s ende ; B: ja, kein Buchstabe
cmpi.b #'Z', d2 ; zeichen <= 'Z' ?
bls.s true ; B: ja, Buchstabe
subi.b #'ü', d0 ; zeichen = ü ?
blo.s ende ; B: ueberhaupt kein Sonderzeichen
beq.s true ; B: ist ü
subq.b #'ä'-'ü', d0 ; zeichen = ä ?
beq.s true ; B: ja
subi.b #'Ä'-'ä', d0 ; zeichen = Ä ?
beq.s true ; B: ja
subq.b #'ö'-'Ä', d0 ; zeichen = ö ?
beq.s true ; B: ja
subq.b #'Ö'-'ö', d0 ; zeichen = Ö ?
beq.s true ; B: ja
subq.b #'Ü'-'Ö', d0 ; zeichen = Ü ?
beq.s true ; B: ja
subi.b #'ß'-'Ü', d0 ; zeichen = ß ? *** subi.b #$E1-'Ü', d0
bne.s ende ; B: kein Umlaut
true:
moveq #1, d1 ; sonst TRUE
ende:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 142EH, 000CH );
INLINE( 1002H );
INLINE( 0202H, 00DFH );
INLINE( 0C02H, 0041H );
INLINE( 652CH );
INLINE( 0C02H, 005AH );
INLINE( 6324H );
INLINE( 0400H, 0081H );
INLINE( 6520H );
INLINE( 671CH );
INLINE( 5700H );
INLINE( 6718H );
INLINE( 0400H, 000AH );
INLINE( 6712H );
INLINE( 5D00H );
INLINE( 670EH );
INLINE( 5B00H );
INLINE( 670AH );
INLINE( 5300H );
INLINE( 6706H );
INLINE( 0400H,0004H ); (*** INLINE( 0400H,0047H )*)
INLINE( 6602H );
INLINE( 7201H );
INLINE( 1D41H, 000EH );
END IsGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE IsSmallASCIIUmlaut ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( kleinesASCIIae <= zeichen ) & ( zeichen <= ASCIIsz ));
END IsSmallASCIIUmlaut;
(* --------------------------------------------------------------------------*)
PROCEDURE IsBigASCIIUmlaut ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( grossesASCIIae <= zeichen ) & ( zeichen <= grossesASCIIue ));
END IsBigASCIIUmlaut;
(* --------------------------------------------------------------------------*)
PROCEDURE IsASCIIUmlaut ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN(( kleinesASCIIae <= zeichen ) & ( zeichen <= ASCIIsz ) OR
( grossesASCIIae <= zeichen ) & ( zeichen <= grossesASCIIue ));
zeichen EQU 12
RETURN EQU zeichen + 2
IsASCIIUmlaut:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer schnellen Zugriff
cmpi.b #'~', d0 ; zeichen = sz ?
beq.s true ; B: ja, ist ASCII-Umlaut
andi.b #%11011111, d0 ; klein -> gross
subi.b #'[', d0 ; zeichen < grossesASCIIae ?
blo.s ende ; B: ja, kein ASCII-Umlaut
subq.b #']'-'[', d0 ; zeichen > grossesASCIIue ?
bhi.s ende ; B: ja, kein ASCII-Umlaut
true:
moveq #1, d1 ; sonst TRUE
ende:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH,000CH );
INLINE( 0C00H,007EH );
INLINE( 670EH );
INLINE( 0200H,00DFH );
INLINE( 0400H,005BH );
INLINE( 6506H );
INLINE( 5500H );
INLINE( 6202H );
INLINE( 7201H );
INLINE( 1D41H,000EH );
END IsASCIIUmlaut;
(* --------------------------------------------------------------------------*)
PROCEDURE IsSmallASCIIGerman ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( 'a' <= zeichen ) & ( zeichen <= ASCIIsz ));
END IsSmallASCIIGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE IsBigASCIIGerman ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
RETURN(( 'A' <= zeichen ) & ( zeichen <= grossesASCIIue ));
END IsBigASCIIGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE IsASCIIGerman ((* EIN/ -- *) zeichen : CHAR ): BOOLEAN;
(*T*)
BEGIN
(* RETURN((( 'a' <= zeichen ) & ( zeichen <= ASCIIsz )) OR
(( 'A' <= zeichen ) & ( zeichen <= grossesASCIIue )));
zeichen EQU 12
RETURN EQU zeichen + 2
IsASCIIGerman:
moveq #0, d1 ; Default: FALSE
move.b zeichen(a6), d0 ; fuer schnellen Zugriff
cmpi.b #'~', d0 ; zeichen = sz ?
beq.s true ; B: ja,
andi.b #%11011111, d0 ; klein -> gross
cmpi.b #'A', d0 ; zeichen < 'A' ?
blo.s ende ; B: ja, kein deut. Buchst.
cmpi.b #']', d0 ; zeichen > grossesASCIIue ?
bhi.s ende ; B: ja, kein deut. Buchst.
true:
moveq #1, d1 ; sonst TRUE
ende:
move.b d1, RETURN(a6)
*)
INLINE( 7200H );
INLINE( 102EH,000CH );
INLINE( 0C00H,007EH );
INLINE( 6710H );
INLINE( 0200H,00DFH );
INLINE( 0C00H,0041H );
INLINE( 6508H );
INLINE( 0C00H,005DH );
INLINE( 6202H );
INLINE( 7201H );
INLINE( 1D41H,000EH );
END IsASCIIGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE IsOneOfSet ((* EIN/ -- *) zeichen : CHAR;
(* EIN/ -- *) charSet : ARRAY OF CHAR ): BOOLEAN;
(*T*)
(* VAR Index : CARDINAL; *)
BEGIN
(* Index := 0;
LOOP
IF ( Index > VAL( CARDINAL, HIGH( charSet ))) OR
( charSet[ Index ] = NUL )
THEN
RETURN( FALSE );
ELSIF charSet[ Index ] = zeichen THEN
RETURN( TRUE );
END;
INC( Index );
END; (* LOOP *)
Hier lohnt sich die Assemblercodierung...
charSet EQU 12
HIGH EQU charSet + 4
zeichen EQU HIGH + 2
RETURN EQU zeichen + 2
IsOneOfSet:
moveq #0, d3
movea.l charSet(a6), a0
move.w HIGH(a6), d0
move.b zeichen(a6), d1
setlp:
move.b (a0)+, d2
beq.s ende
cmp.b d1, d2
dbeq d0, setlp
bne.s ende
moveq #1, d3
ende:
move.b d3, RETURN(a6)
*)
INLINE( 7600H );
INLINE( 206EH,000CH );
INLINE( 302EH,0010H );
INLINE( 122EH,0012H );
INLINE( 1418H );
INLINE( 670AH );
INLINE( 0B401H );
INLINE( 57C8H,0FFF8H );
INLINE( 6602H );
INLINE( 7601H );
INLINE( 1D43H,0014H );
END IsOneOfSet;
(* --------------------------------------------------------------------------*)
PROCEDURE LowerCase ((* EIN/ -- *) zeichen : CHAR ): CHAR;
(*T*)
BEGIN
(* IF ('A' <= zeichen ) & ( zeichen <= 'Z') THEN
RETURN( CHR( ORD( zeichen ) + 20H ));
ELSE
RETURN( zeichen );
END;
zeichen EQU 12
RETURN EQU zeichen + 2
LowerCase:
move.b zeichen(a6), d0
cmpi.b #'A', d0
blo.s ende
cmpi.b #'Z', d0
bhi.s ende
ori.b #%00100000, d0
ende:
move.b d0, RETURN(a6)
*)
INLINE( 102EH,000CH );
INLINE( 0C00H,0041H );
INLINE( 650AH );
INLINE( 0C00H,005AH );
INLINE( 6204H );
INLINE( 0000H,0020H );
INLINE( 1D40H,000EH );
END LowerCase;
(* --------------------------------------------------------------------------*)
PROCEDURE LowerCaseGerman ((* EIN/ -- *) zeichen : CHAR ): CHAR;
(*T*)
BEGIN
(* IF ('A' <= zeichen ) & ( zeichen <= 'Z') THEN
RETURN( CHR( ORD( zeichen ) + 20H ));
ELSIF zeichen >= grossesAE THEN
IF zeichen = grossesAE THEN
RETURN( kleinesAE );
ELSIF zeichen = grossesOE THEN
RETURN( kleinesOE );
ELSIF zeichen = grossesUE THEN
RETURN( kleinesUE );
END;
END;
RETURN( zeichen );
zeichen EQU 12
RETURN EQU zeichen + 2
LowerCaseGerman:
move.b zeichen(a6), d0
cmpi.b #'A', d0
blo.s ende
cmpi.b #'Z', d0
bhi.s tstae
ori.b #%00100000, d0
bra.s ende
tstae:
cmpi.b #'Ä', d0
blo.s ende
bne.s tstoe
move.b #'ä', d0
bra.s ende
tstoe:
cmpi.b #'Ö', d0
bne.s tstue
move.b #'ö', d0
bra.s ende
tstue:
cmpi.b #'Ü', d0
bne.s ende
move.b #'ü', d0
ende:
move.b d0, RETURN(a6)
*)
INLINE( 102EH,000CH );
INLINE( 0C00H,0041H );
INLINE( 6530H );
INLINE( 0C00H,005AH );
INLINE( 6206H );
INLINE( 0000H,0020H );
INLINE( 6024H );
INLINE( 0C00H,008EH );
INLINE( 651EH );
INLINE( 6606H );
INLINE( 103CH,0084H );
INLINE( 6016H );
INLINE( 0C00H,0099H );
INLINE( 6606H );
INLINE( 103CH,0094H );
INLINE( 600AH );
INLINE( 0C00H,009AH );
INLINE( 6604H );
INLINE( 103CH,0081H );
INLINE( 1D40H,000EH );
END LowerCaseGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE LowerCaseASCIIGerman ((* EIN/ -- *) zeichen : CHAR ): CHAR;
(*T*)
BEGIN
(* IF ('A' <= zeichen ) & ( zeichen <= grossesASCIIue ) THEN
RETURN( CHR( ORD( zeichen ) + 20H ));
ELSE
RETURN( zeichen );
END;
zeichen EQU 12
RETURN EQU zeichen + 2
LowerCaseASCIIGerman:
move.b zeichen(a6), d0
cmpi.b #'A', d0
blo.s ende
cmpi.b #']', d0
bhi.s ende
ori.b #%00100000, d0
ende:
move.b d0, RETURN(a6)
*)
INLINE( 102EH,000CH );
INLINE( 0C00H,0041H );
INLINE( 650AH );
INLINE( 0C00H,005DH );
INLINE( 6204H );
INLINE( 0000H,0020H );
INLINE( 1D40H,000EH );
END LowerCaseASCIIGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE CAPGerman ((* EIN/ -- *) zeichen : CHAR ): CHAR;
(*T*)
BEGIN
(* IF zeichen >= kleinesUE THEN
IF zeichen = kleinesUE THEN
RETURN( grossesUE );
ELSIF zeichen = kleinesAE THEN
RETURN( grossesAE );
ELSIF zeichen = kleinesOE THEN
RETURN( grossesOE );
END;
END;
RETURN( CAP( zeichen ));
zeichen EQU 12
RETURN EQU zeichen + 2
CAPGerman:
move.b zeichen(a6), d0
cmpi.b #'ü', d0 ; zeichen >= kleinesUE ?
blo.s cap ; B: nein kein kl. Uml.
bne.s tstae ; B: ist nicht kleinesUE
move.b #'Ü', d0 ; sonst grossesUE
bra.s ende ; fertig
tstae:
cmpi.b #'ä', d0 ; zeichen = kleinesAE ?
bne.s tstoe ; B: nein
move.b #'Ä', d0 ; sonst zeichen := grossesAE
bra.s ende
tstoe:
cmpi.b #'ö', d0 ; zeichen = kleinesOE ?
bne.s ende ; B: nein, weder kl. Uml noch kl. Buchst.
move.b #'Ö', d0 ; zeichen := grossesOE
bra.s ende
cap:
cmpi.b #'a', d0 ; zeichen >= 'a' ?
blo.s ende ; B: nein, kein Kleinbuchst.
cmpi.b #'z', d0 ; zeichen <= 'z' ?
bhi.s ende ; B: nein, kein Kleinbuchst.
andi.b #%11011111, d0 ; klein -> gross
ende:
move.b d0, RETURN(a6)
*)
INLINE( 102EH,000CH );
INLINE( 0C00H,0081H );
INLINE( 6520H );
INLINE( 6606H );
INLINE( 103CH,009AH );
INLINE( 6028H );
INLINE( 0C00H,0084H );
INLINE( 6606H );
INLINE( 103CH,008EH );
INLINE( 601CH );
INLINE( 0C00H,0094H );
INLINE( 6616H );
INLINE( 103CH,0099H );
INLINE( 6010H );
INLINE( 0C00H,0061H );
INLINE( 650AH );
INLINE( 0C00H,007AH );
INLINE( 6204H );
INLINE( 0200H,00DFH );
INLINE( 1D40H,000EH );
END CAPGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE CAPGermanASCII ((* EIN/ -- *) zeichen : CHAR ): CHAR;
(*T*)
BEGIN
(* IF ( zeichen >= 'a' ) & ( zeichen <= kleinesASCIIue ) THEN
RETURN( CHR( ORD( zeichen ) - 20H ));
ELSE
RETURN( zeichen );
END;
zeichen EQU 12
RETURN EQU zeichen + 2
CAPGermanASCII:
move.b zeichen(a6), d0
cmpi.b #'a', d0
blo.s ende
cmpi.b #'}', d0
bhi.s ende
andi.b #%11011111, d0
ende:
move.b d0, RETURN(a6)
*)
INLINE( 102EH,000CH );
INLINE( 0C00H,0061H );
INLINE( 650AH );
INLINE( 0C00H,007DH );
INLINE( 6204H );
INLINE( 0200H,00DFH );
INLINE( 1D40H,000EH );
END CAPGermanASCII;
(* --------------------------------------------------------------------------*)
PROCEDURE ToAtariGerman ((* EIN/ -- *) zeichen : CHAR ): CHAR;
(*T*)
BEGIN
IF ( kleinesASCIIae <= zeichen ) & ( zeichen <= ASCIIsz ) THEN
RETURN( LcAtari[ ORD( zeichen ) - ORD( kleinesASCIIae ) ] );
ELSIF ( grossesASCIIae <= zeichen ) & ( zeichen <= grossesASCIIue ) THEN
RETURN( UcAtari[ ORD( zeichen ) - ORD( grossesASCIIae ) ] );
ELSIF zeichen = ASCIIParagraph THEN
RETURN( Paragraph );
ELSE
RETURN( zeichen );
END;
END ToAtariGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE ToASCIIGerman ((* EIN/ -- *) zeichen : CHAR ): CHAR;
(*T*)
BEGIN
CASE zeichen OF
kleinesAE : RETURN( kleinesASCIIae );
| kleinesOE : RETURN( kleinesASCIIoe );
| kleinesUE : RETURN( kleinesASCIIue );
| grossesAE : RETURN( grossesASCIIae );
| grossesOE : RETURN( grossesASCIIoe );
| grossesUE : RETURN( grossesASCIIue );
| SZ : RETURN( ASCIIsz );
ELSE
IF zeichen = Paragraph THEN (* Paragraph extra, sonst wird die *)
RETURN( ASCIIParagraph ); (* Sprungtabelle des CASE-Konstruk-*)
ELSE (* tes zu gross. *)
RETURN( zeichen );
END; (* IF *)
END; (* CASE *)
END ToASCIIGerman;
(* --------------------------------------------------------------------------*)
PROCEDURE DigitToCard ((* EIN/ -- *) digit : CHAR ): CARDINAL;
(*T*)
BEGIN
RETURN( ORD( digit ) - ORD('0') );
END DigitToCard;
(* --------------------------------------------------------------------------*)
PROCEDURE CardToDigit ((* EIN/ -- *) card : CARDINAL ): CHAR;
(*T*)
BEGIN
RETURN( CHR( card + VAL( CARDINAL, ORD('0'))));
END CardToDigit;
(* --------------------------------------------------------------------------*)
PROCEDURE CardToHexDigit ((* EIN/ -- *) hexvalue : CARDINAL ): CHAR;
(*T*)
BEGIN
RETURN( hexdigits[ hexvalue MOD 16 ] );
END CardToHexDigit;
(* --------------------------------------------------------------------------*)
PROCEDURE HexDigitToCard ((* EIN/ -- *) hexdigit : CHAR ): CARDINAL;
(*T*)
BEGIN
IF hexdigit <= '9' THEN
RETURN( ORD( hexdigit ) - ORD('0'));
ELSE
RETURN( ORD( CAP( hexdigit )) - ORD('A') + 10 );
END;
END HexDigitToCard;
(*===========================================================================*)
BEGIN (* statt Konstanten, sonst nicht indizierbar...@$!\# *)
LcAtari := 'äöüß';
UcAtari := 'ÄÖÜ';
hexdigits := '0123456789ABCDEF';
END Chars.